package persistencia;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import modelo.datos.Direccion;
import modelo.datos.Empresa;
import modelo.datos.Entrada;
import modelo.datos.Persona;
import modelo.datos.Telefono;
import modelo.datos.utils.ListaEntradas;
import es.uji.www.GeneradorDatosINE;

public class BaseDatosMemoriaImpl implements BaseDatos {
	private static final int NUMERO_ENTRADAS = 3;
	private List<Entrada> entradas;
	private final static GeneradorDatosINE generador = new GeneradorDatosINE();
	private Date ultimaMoficacion;
	
	public BaseDatosMemoriaImpl() {
		super();
		iniciaBaseDatos();
		ultimaMoficacion = new Date();
	}
	
	private void iniciaBaseDatos() {
		entradas = new ArrayList<Entrada>();
		String nombre;
		String apellidos;
		String nif;
		String poblacion;
		String provincia;
		List<Telefono> telefonos = new ArrayList<>();
		Telefono telefono = new Telefono((short)(Math.random()*100), 
				(int)(Math.random()*1000000));
		telefonos.add(telefono);
		nuevaEntrada(new Persona("Oscar", "Belmonte", "123",
				new Direccion("Castellón", "Castellón de la Plana"),
				telefonos));
		for(int i = 0; i < NUMERO_ENTRADAS; i++) {
			nombre = generador.getNombre();
			apellidos = generador.getApellido() + generador.getApellido();
			nif = generador.getNIF();
			provincia = generador.getProvincia();
			poblacion = generador.getPoblacion(provincia);
			telefonos = new ArrayList<>();
			telefono = new Telefono((short)(Math.random()*100), 
					(int)(Math.random()*1000000));
			telefonos.add(telefono);
			nuevaEntrada(new Persona(nombre, apellidos, nif, 
					new Direccion(provincia, poblacion), telefonos));
			nombre = generador.getNombre();
			nif = generador.getNIF();
			provincia = generador.getProvincia();
			poblacion = generador.getPoblacion(provincia);
			telefonos = new ArrayList<>();
			telefono = new Telefono((short)(Math.random()*100), 
					(int)(Math.random()*1000000));
			telefonos.add(telefono);
			telefono = new Telefono((short)(Math.random()*100), 
					(int)(Math.random()*1000000));
			telefonos.add(telefono);
			nuevaEntrada(new Empresa(nombre, nif, 
					new Direccion(provincia, poblacion), telefonos));
		}
	}
	
	public ListaEntradas getEntradas() {
		return new ListaEntradas(entradas);
	}
	
	public Entrada buscaEntradaPorNIF(String nif) {
		for(Entrada entrada: entradas)
			if(entrada.getNif().equals(nif))
				return entrada;
		return ENTRADA_NULL;
	}

	@Override
	public void nuevaEntrada(Entrada entrada) {
		entradas.add(entrada);
//		ultimaMoficacion = new Date();
	}

//	public void nuevaPersona(String nombre, String apellidos, String nif) {
//		Entrada entrada = new Persona(nombre, apellidos, nif);
//		nuevaEntrada(entrada);
//	}
//	
//	public void nuevaEmpresa(String nombre, String nif) {
//		Entrada entrada = new Empresa(nombre, nif); 
//		nuevaEntrada(entrada);
//	}
	
	public boolean actualizaEntrada(Entrada entrada) {
		Entrada enLista = buscaEntradaPorNIF(entrada.getNif());
		if(enLista != null) {
			enLista.actualiza(entrada);
			return true;
		}
		return false;
	}

	public boolean borraEntrada(String nif) {
		Entrada entrada = buscaEntradaPorNIF(nif);
		if(entrada == ENTRADA_NULL) return false;
		else entradas.remove(entrada);
		return true;
	}

	public Date getUltimaModificacion() {
		return ultimaMoficacion;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((entradas == null) ? 0 : entradas.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		BaseDatosMemoriaImpl other = (BaseDatosMemoriaImpl) obj;
		if (entradas == null) {
			if (other.entradas != null)
				return false;
		} else if (!entradas.equals(other.entradas))
			return false;
		return true;
	}
}
